//ctors

inline FastUInt::FastUInt(const UInt i_num)
{
	m_data.push_back(i_num);
}

inline FastUInt::FastUInt(const char* i_string)
{
	Assign(i_string);
}

inline FastUInt::FastUInt(const std::string& i_string)
{
	Assign(i_string);
}

inline FastUInt::FastUInt( const GreatUInt& i_that )
{
	Assign(i_that);
}

inline FastUInt::FastUInt(const UInt i_num, const size_t i_reservation)
{
	m_data.reserve(i_reservation);
	m_data.push_back(i_num);
}

inline FastUInt::FastUInt(const FastUInt& i_that)
:m_data(i_that.m_data)
{
}

inline FastUInt& FastUInt::operator=(const FastUInt& i_that)
{
	m_data = i_that.m_data;
	return *this;
}

inline FastUInt& FastUInt::operator=(const UInt i_num)
{
	return Assign(i_num);
}

//accessors

inline UInt FastUInt::ToUInt() const
{
	return m_data[0];
}

inline bool FastUInt::IsZero() const
{
	return (m_data.size()==1) && (m_data.at(0)==0);
}

inline bool FastUInt::IsUInt() const
{
	return (m_data.size() == 1);
}

inline bool FastUInt::IsLessThan( const FastUInt& i_that ) const
{
	return Compare(*this, i_that) < 0;
}

//modifiers

inline FastUInt& FastUInt::Assign(const UInt i_num)
{
	m_data.clear();
	m_data.push_back(i_num);
	return *this;
}

inline FastUInt& FastUInt::Assign(const char* i_string)
{
	if(i_string)
		return Assign(std::string(i_string));

	return SetZero();
}

inline FastUInt& FastUInt::SetZero()
{
	m_data.clear();
	m_data.push_back(0);
	return *this;
}

inline FastUInt& FastUInt::SetOne()
{
	m_data.clear();
	m_data.push_back(1);
	return *this;
}

inline FastUInt FastUInt::operator++(int)
{
	FastUInt temp(*this);
	++*this;
	return temp;
}

inline FastUInt FastUInt::operator--(int)
{
	FastUInt temp(*this);
	--*this;
	return temp;
}

inline FastUInt& FastUInt::operator/=(const FastUInt& i_that)
{
	return DivWithRem(*this, i_that);
}

inline FastUInt& FastUInt::operator%=(const FastUInt& i_that)
{
	return DivWithRem(*this, i_that, false);
}

inline FastUInt& FastUInt::Add(const FastUInt& i_first, const FastUInt& i_second)
{
	return operator=(i_first).operator+=(i_second);
}

inline FastUInt& FastUInt::Sub(const FastUInt& i_first, const FastUInt& i_second)
{
	return operator=(i_first).operator-=(i_second);
}

inline FastUInt& FastUInt::Mul(const FastUInt& i_first, const FastUInt& i_second)
{
	return operator=(i_first).operator*=(i_second);
}

inline FastUInt& FastUInt::BitAnd(const FastUInt& i_first, const FastUInt& i_second)
{
	return operator=(i_first).operator&=(i_second);
}

inline FastUInt& FastUInt::BitOr(const FastUInt& i_first, const FastUInt& i_second)
{
	return operator=(i_first).operator|=(i_second);
}

inline FastUInt& FastUInt::BitXor(const FastUInt& i_first, const FastUInt& i_second)
{
	return operator=(i_first).operator^=(i_second);
}

inline void FastUInt::Swap(FastUInt& i_that)
{
	m_data.swap(i_that.m_data);
}

// non members

inline const FastUInt operator+(const FastUInt& i_left, const FastUInt& i_right)
{
	FastUInt temp(i_left);
	temp+=i_right;
	return temp;
}
inline const FastUInt operator*(const FastUInt& i_left, const FastUInt& i_right)
{
	FastUInt temp(i_left);
	temp*=i_right;
	return temp;
}

inline const FastUInt operator*(const FastUInt& i_FastUInt, UInt i_factor)
{
	FastUInt temp(i_FastUInt);
	temp*=i_factor;
	return temp;
}

inline const FastUInt operator*(UInt i_factor, const FastUInt& i_FastUInt)
{
	FastUInt temp(i_FastUInt);
	temp*=i_factor;
	return temp;
}

inline const FastUInt operator/(const FastUInt& i_left, const FastUInt& i_right)
{
	FastUInt temp(i_left);
	temp*=i_right;
	return temp;
}

inline UInt operator%(const FastUInt& i_FastUInt, UInt i_factor)
{
	return i_FastUInt.m_data.at(0)%i_factor;
}

inline const FastUInt operator%(const FastUInt& i_left, const FastUInt& i_right)
{
	FastUInt temp(i_left);
	temp%=i_right;
	return temp;
}

inline const FastUInt operator&(const FastUInt& i_left, const FastUInt& i_right)
{
	FastUInt temp(i_left);
	temp&=i_right;
	return temp;
}

inline const FastUInt operator|(const FastUInt& i_left, const FastUInt& i_right)
{
	FastUInt temp(i_left);
	temp|=i_right;
	return temp;
}

inline const FastUInt operator^(const FastUInt& i_left, const FastUInt& i_right)
{
	FastUInt temp(i_left);
	temp^=i_right;
	return temp;
}

inline bool operator<(const FastUInt& i_left, const FastUInt& i_right)
{
	return Compare(i_left,i_right) < 0;
}

inline bool operator<=(const FastUInt& i_left, const FastUInt& i_right)
{
	return Compare(i_left,i_right) <= 0;
}

inline bool operator>(const FastUInt& i_left, const FastUInt& i_right)
{
	return Compare(i_left,i_right) > 0;
}

inline bool operator>=(const FastUInt& i_left, const FastUInt& i_right)
{
	return Compare(i_left,i_right) >= 0;
}

inline bool operator!=(const FastUInt& i_left, const FastUInt& i_right)
{
	return i_left.m_data != i_right.m_data;
}

inline bool operator==(const FastUInt& i_left, const FastUInt& i_right)
{
	return i_left.m_data == i_right.m_data;
}

inline const FastUInt Exp( const FastUInt& i_base, const UInt i_exp )
{
	FastUInt temp(i_base);
	return temp.ApplyExp(i_exp);
}

